package com.qianfeng.netty.http;

//
//                            _ooOoo_  
//                           o8888888o  
//                           88" . "88  
//                           (| -_- |)  
//                            O\ = /O  
//                        ____/`---'\____  
//                      .   ' \\| |// `.  
//                       / \\||| : |||// \  
//                     / _||||| -:- |||||- \  
//                       | | \\\ - /// | |  
//                     | \_| ''\---/'' | |  
//                      \ .-\__ `-` ___/-. /  
//                   ___`. .' /--.--\ `. . __  
//                ."" '< `.___\_<|>_/___.' >'"".  
//               | | : `- \`.;`\ _ /`;.`/ - ` : | |  
//                 \ \ `-. \_ __\ /__ _/ .-` / /  
//         ======`-.____`-.___\_____/___.-`____.-'======  
//                            `=---='  
//  
//         .............................................  
//                  佛祖镇楼                  BUG辟易  
//          佛曰:  
//                  写字楼里写字间，写字间里程序员；  
//                  程序人员写程序，又拿程序换酒钱。  
//                  酒醒只在网上坐，酒醉还来网下眠；  
//                  酒醉酒醒日复日，网上网下年复年。  
//                  但愿老死电脑间，不愿鞠躬老板前；  
//                  奔驰宝马贵者趣，公交自行程序员。  
//                  别人笑我忒疯癫，我笑自己命太贱；  
//  


import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.*;
import io.netty.util.CharsetUtil;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by Jackiechan on 2022/2/18/10:46
 * tomcat只负责将用户的请求转变成request和response等对象,最终怎么处理还是需要我们的controller来处理,这个类类似于controller
 * @author Jackiechan
 * @version 1.0
 * @since 1.0
 */
public class MyHttpServerHandler extends SimpleChannelInboundHandler<HttpObject> {
    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, HttpObject httpObject) throws Exception {
       // System.err.println("MyHttpServerHandler中的方法channelRead0 执行了" + channelHandlerContext + "---->" + httpObject);
        //当前方法是在收到http请求的时候就会执行httpObject其实就是我们的请求的封装对象,包括头等等
        if (httpObject instanceof HttpRequest) {
            HttpMethod method = ((DefaultHttpRequest) httpObject).method();
           // System.err.println("请求方式:"+method.name());
            String uri = ((DefaultHttpRequest) httpObject).uri();
            System.err.println("请求的地址" + uri);

            if ("/favicon.ico".equalsIgnoreCase(uri)) {
                //请求的是logo
                return;
            }
            String queryString = uri.substring(uri.indexOf("?")+1);
            String[] split = queryString.split("&");//数组中每个字符串都是key=value的类型
            List<String> list = Arrays.asList(split);//返回的是一个不可变的集合,不能添加删除数据,否则会抛出异常
            Map<String, String> params = new HashMap<>();//保存有参数的map
            for (String s : list) {
                String[] keyValue = s.split("=");//name admin
                params.put(keyValue[0], keyValue[1]);
            }

            //根据请求的地址,找到对应的方法
            String requestUrl = uri.substring(0, uri.indexOf("?"));//获取到请求的路径
            //想办法把参数传递过去执行方法,获取返回求
            Method currentMethod = TestMain.allMapping.get(requestUrl);//获取要执行的目标方法
            Object currentController = TestMain.allControllers.get(requestUrl);//要执行的目标controller

            if (currentMethod != null) {
                Parameter[] parameters = currentMethod.getParameters();//获取到方法的参数列表
                Object[] realParams = new Object[parameters.length];
                for (int i = 0; i < parameters.length; i++) {
                    String name = parameters[i].getName();//获取到每一个参数的名字
                    realParams[i] = params.get(name);//把这个名字对应的参数设置到真正的参数的位置上
                }
                String result = (String) currentMethod.invoke(currentController, realParams);
                ByteBuf buffer = Unpooled.copiedBuffer(result, CharsetUtil.UTF_8);//设置返回的内容
                DefaultFullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK,buffer);
                response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/html;charset=UTF-8").set(HttpHeaderNames.CONTENT_LENGTH, buffer.readableBytes());
                channelHandlerContext.writeAndFlush(response);
            }

//            System.err.println(params);
//            MyUserController myUserController = new MyUserController();
//            String result = myUserController.login(params.get("username"), params.get("password"));

            //根据请求地址找到方法,找处理器映射器要




            //设置响应头

        }

    }
}
